#ifndef LECTEURPHRASESIMPLE_H_
#define LECTEURPHRASESIMPLE_H_

#include "LecteurSymbole.h"

class LecteurPhraseSimple {
public:
	LecteurPhraseSimple(string nomFich);	// Construit un lecteur de phrase pour vérifier
						// la syntaxe du programme dans le fichier nomFich
	void analyse();	// méthode qui réalise l'analyse. Si la syntaxe est correcte,
			// cette méthode se termine et affiche un message "Syntaxe correcte"
			// sinon, le programme est interrompu (exit).
			
private:
	LecteurSymbole ls;	// le lecteur de symboles utilisé pour analyser le fichier
				// implémentation de la grammaire
	void programme();	// <programme>	::= debut <seqInst> fin <EOF>
	void seqInst();		// <seq_ins>	::= <inst> ; { <inst> ; }
	void inst();		// <inst>	::= <affectation> | <instSi> | <instTq> | <instRepeter>
	void affectation();	// <affectation>::= <variable> = ( <expression> | <chaine> )
	void expression();	// <expression>	::= <terme> { <opAdd> <terme> }
	void facteur();		//  <facteur> ::=  <entier> | <variable> | <opUnaire> <expBool> | ( <expBool> )
	void terme();		// <terme>	::= <facteur> { <opMult> <facteur> }
	void opAdd();		// <opAdd>	::= + | -
	void opMult();		// <opMult>	::= * | /
	
	// Instructions de controle
	void instSi();		// <instSi>	::= si ( <expBool> ) alors <seqInst> { sinonsi ( <expBool> ) alors <seqInst> } [ sinon <seqInst> ] finsi
	void instTq();		// <instTq>	::= tantque ( <expBool> ) faire <seqInst> fintantque
	void instRepeter();	// <instRepeter>::= repeter <seqInst> jusqua ( <expBool> ) 
	void instPour();	// <instPour>	::= pour ( <affectation> ; <expBool> ; <affectation> ) faire <seqInst> finpour
	
	// Entrées - Sorties
	void instLire();	// <instLire>	::= lire ( <variable> )
	void instEcrire();	// <instEcrire>	::= ecrire ( <expression> | <chaine> )
	
	// Expressions booleennes
	void expBool();		// <expBool> ::= <expBoolEt> { <opBoolOu> <expBoolEt> }
	void expBoolEt();	// <expBoolEt> ::= <relation> {<opBoolEt> <relation> }
	void opBoolEt();		// <opBool> ::= et  
	void opBoolOu();		// <opBool> ::= ou    
	void relation();	// <relation> ::= <expression> { <opRel> <expression> }
	void opRel();		// <opRel> ::=  == | != | < | <= | > | >=  
	void opUnaire();	// <opUnaire> ::=    - | non   
	
	// outils pour se simplifier l'analyse syntaxique
	void testerSymCour (string ch);	// si symbole courant != ch, erreur : on arrête le programme, sinon rien
	void sauterSymCour (string ch);	// si symbole courant == ch, on passe au symbole suivant, sinon on arrête
	void erreur (string mess);	// affiche les message d'erreur mess et arrête le programme
};

#endif
